using System;
using System.Collections.Generic;
using System.Text;

namespace ParasiTracer
{
    internal class DsvParser
    {
        char _delim = ',';

        public DsvParser()
        { 
            //
        }

        public DsvParser(char delim)
        {
            _delim = delim;
        }

        public List<string> trabajar(string renglon)
        {
            var lista = new List<string>();
            var index = 0;
            var objeto = new StringBuilder();

            while (index < renglon.Length)
            {
                if (_delim == renglon[index])
                {
                    lista.Add(objeto.ToString());
                    objeto = new StringBuilder();
                }
                else if ('#' == renglon[index])
                {
                    break;
                }
                else if ('\\' == renglon[index])
                {
                    index++;

                    // si no hay nada despues de un \
                    if (!(index < renglon.Length))
                        throw new Exception(
                            "Falta el caracter de escape despues de '\\'"
                        );
                    else if ('\\' == renglon[index])
                        objeto.Append('\\');
                    else if ('n' == renglon[index])
                        objeto.Append('\n');
                    else if ('r' == renglon[index])
                        objeto.Append('\r');
                    else if ('#' == renglon[index])
                        objeto.Append('#');
                    else if (_delim == renglon[index])
                        objeto.Append(_delim);
                    else
                        throw new Exception(
                            string.Format("Secuencia de escape '{0}' no reconocida", renglon[index])
                        );
                }
                else
                {
                    objeto.Append(renglon[index]);
                }

                index++;
            }

            lista.Add(objeto.ToString());
            return lista;
        }

        //void parseErrorAndDie(string mensaje, string renglon, int col)
        //{
        //    Console.ForegroundColor = ConsoleColor.Gray;
        //    Console.WriteLine(renglon.Substring(0, col));
        //    Console.ForegroundColor = ConsoleColor.Red;
        //    string pad = new string(' ', (col - 1) % Console.BufferWidth);
        //    Console.WriteLine(pad + "^");
        //    Console.WriteLine(pad + "|");
        //    Console.WriteLine("Parsing error: {0}, lin {1} col {2}", mensaje, _linea, col);
        //    Console.ForegroundColor = ConsoleColor.Gray;
        //    Environment.Exit(-1);
        //}
    }
}
